﻿using System.Collections.Generic;
using System.Linq;
using Controller2.Models;
using System.Data;
using System;

namespace Controller2.BLL
{
    public class BrainstormBll
    {
        public static Brainstorm_Topico GetBrainstorm_Topico(ControllerBDModelContainer db, int id)
        {
            return db.Brainstorm_Topico.FirstOrDefault(c => c.IdTopico == id);
        }

        public static IEnumerable<Brainstorm_Topico> GetAllBrainstorm_Topicos(ControllerBDModelContainer db)
        {
            return (from c in db.Brainstorm_Topico orderby c.DataCadastro select c).OrderBy(c => c.DataCadastro).ToList();
        }

        public static Brainstorm_Mensagem GetBrainstorm_Mensagem(ControllerBDModelContainer db, int id)
        {
            return db.Brainstorm_Mensagem.FirstOrDefault(c => c.IdMensagem == id);
        }

        public static IEnumerable<Brainstorm_Mensagem> GetAllBrainstorm_Mensagens(ControllerBDModelContainer db, int id)
        {
            return (from c in db.Brainstorm_Mensagem where c.IdTopico == id orderby c.DataCadastro select c).OrderBy(c => c.DataCadastro).ToList();
        }

        public static int GetBrainstorm_ContagemPositivo(ControllerBDModelContainer db, int id)
        {
            return db.ContagemPositivo.Count(c => c.Positivo && c.IdMensagem == id);
        }

        public static int GetBrainstorm_ContagemNegativo(ControllerBDModelContainer db, int id)
        {
            return db.ContagemPositivo.Count(c => c.Negativo && c.IdMensagem == id);
        }

        public static Dictionary<string, int> PesquisarPorTopico(ControllerBDModelContainer db, string termo)
        {
            var topicos = db.Brainstorm_Topico.Where(w => w.Topico.Contains(termo)).Select(s => new { ID = s.IdTopico, Topico = s.Topico }).ToList();
            var dic = new Dictionary<string, int>();
            foreach (var item in topicos)
            {
                dic.Add(item.Topico, item.ID);
            }
            return dic;
        }

        public static DataTable Relatorios(ControllerBDModelContainer db, int codigo, string dataInicial, string dataFinal, bool campanha = false)
        {
            IEnumerable<Brainstorm_Topico> lista;
            if (codigo > 0 && !campanha)
            {
                lista = (from c in db.Brainstorm_Topico
                         where c.IdTopico == codigo
                         orderby c.DataCadastro
                         select c
                         ).OrderBy(c => c.DataCadastro).ToList();
            }            
            else if (codigo > 0 && campanha)
            {
                lista = (from c in db.Brainstorm_Topico
                         where c.IdCampanha == codigo
                         orderby c.DataCadastro
                         select c
                         ).OrderBy(c => c.DataCadastro).ToList();
            }
            else if (!string.IsNullOrWhiteSpace(dataInicial))
            {
                var di = Convert.ToDateTime(dataInicial);
                var df = Convert.ToDateTime(dataFinal);
                lista = (from c in db.Brainstorm_Topico
                         where c.DataCadastro >= di && c.DataCadastro <= df
                         orderby c.DataCadastro
                         select c
                         ).OrderBy(c => c.DataCadastro).ToList();
            }
            else
            {
                lista = (from c in db.Brainstorm_Topico
                         orderby c.DataCadastro
                         select c
                         ).OrderBy(c => c.DataCadastro).ToList();
            }

            var dt = new DataTable();
            dt.Columns.Add("DataCadastro", typeof(DateTime));
            dt.Columns.Add("IdTopico", typeof(String));
            dt.Columns.Add("UserName", typeof(String));
            dt.Columns.Add("Campanha", typeof(String));
            dt.Columns.Add("Topico", typeof(String));
            dt.Columns.Add("QtdeMensagem", typeof(Int32));

            foreach (Brainstorm_Topico b in lista)
            {
                DataRow r = dt.NewRow();
                r["DataCadastro"] = b.DataCadastro;
                r["IdTopico"] = b.IdTopico;
                r["UserName"] = b.UserName;
                r["Topico"] = b.Topico;    
                r["Campanha"] = b.Campanha.Nome;
                r["QtdeMensagem"] = b.Brainstorm_Mensagem.Count();
                dt.Rows.Add(r);
            }
            return dt;
        }

        public static DataTable RelatoriosPorTopico(ControllerBDModelContainer db, int idTopico)
        {
            IEnumerable<Brainstorm_Mensagem> lista;
            lista = (from c in db.Brainstorm_Mensagem
                     where c.Brainstorm_Topico.IdTopico == idTopico
                     orderby c.DataCadastro
                     select c
                    ).OrderBy(c => c.DataCadastro).ToList();

            var dt = new DataTable();
            dt.Columns.Add("DataCadastro", typeof(DateTime));
            dt.Columns.Add("IdTopico", typeof(Int32));
            dt.Columns.Add("Topico", typeof(String));
            dt.Columns.Add("UserName", typeof(String));
            dt.Columns.Add("Mensagem", typeof(String));
            dt.Columns.Add("Positivos", typeof(Int32));
            dt.Columns.Add("Negativos", typeof(Int32));
            dt.Columns.Add("QtdeMensagem", typeof(Int32));                       

            foreach (Brainstorm_Mensagem b in lista)
            {
                DataRow r = dt.NewRow();
                r["DataCadastro"] = b.DataCadastro;
                r["IdTopico"] = b.IdTopico;
                r["Topico"] = b.Brainstorm_Topico.Topico;                
                r["UserName"] = b.UserName;
                r["Mensagem"] = b.Mensagem;
                r["Positivos"] = b.Brainstorm_Mensagem_Contagem.Count(c => c.Positivo && c.IdMensagem == b.IdMensagem);
                r["Negativos"] = b.Brainstorm_Mensagem_Contagem.Count(c => c.Negativo && c.IdMensagem == b.IdMensagem);
                r["QtdeMensagem"] = lista.Count();                
                dt.Rows.Add(r);
            }
            return dt;
        }

        /// <summary>
        /// Faz o autocomplete do campo de texto de pesquisa
        /// </summary>
        /// <param name="db">Contexto de dados</param>
        /// <param name="filtro">Valor do filtro (combobox)</param>
        /// <param name="termoPesquisa">Termo da pesquisa (valor digitado)</param>
        /// <param name="numeroLinhas">Número de registros a serem mostrados</param>
        /// <returns></returns>
        public static IEnumerable<string> AutoComplete(ControllerBDModelContainer db, int filtro, string termoPesquisa, int numeroLinhas)
        {
            IEnumerable<string> resultado;
            int codigo = 0;
            if (filtro == 1)
            {
                if (!int.TryParse(termoPesquisa, out codigo))
                {
                    filtro = 2;
                }
            }
            switch (filtro)
            {
                default:
                    resultado = (from c in db.Brainstorm_Topico.ToList()
                                 where c.IdTopico >= codigo
                                 select c.IdTopico.ToString()).Distinct();
                    break;
                case 2:
                    resultado = (from c in db.Brainstorm_Topico.ToList()
                                 where c.DataCadastro.ToShortDateString().Contains(termoPesquisa)
                                 select c.DataCadastro.ToShortDateString()).Distinct();
                    break;
            }
            return resultado.Take(numeroLinhas);
        }
    }
}